package game.model;

import java.awt.Color;
import java.awt.Point;
import java.util.HashMap;
import java.util.Map;

/**
 * Clase que representa un rayo en el juego.
 * Contiene la informacion necesaria para poder ser graficado por metodos
 * de front end y para que una componente pueda tomar una decision acerca
 * de como reaccionar frente a un rayo.
 *
 */

public class Rayo {
	private Color color;
	private int orientacion;
	protected int imagenID;
	private boolean entrando;

	/**
	 * Contructor de la clase rayo.
	 * @param color color del rayo.
	 * @param orientacion orientacion del rayo en la celda.
	 */
	
	public Rayo(Color color, int orientacion) {
		this.color = color;
		this.orientacion = orientacion;
		setImagen(8);
	}

	/**
	 * Setea el ID de la imagen de la componente. Este valor de ID se relaciona
	 * mediante metodos de front end con el archivo de imagen.
	 * 
	 * @param imagenID entero con el ID de la imagen.
	 */
	
	public void setImagen(int imagenID) {
		this.imagenID = imagenID;
	}

	/**
	 * Retorna el ID de la imagen de la componente.
	 * 
	 * @return int entero con el ID de la imagen.
	 */
	
	public int getImagen() {
		return imagenID;
	}
	
	/**
	 * Retorna la orientacion del rayo.
	 * 
	 * @return int orientacion del rayo.
	 */
	
	public int getOrientacion() {
		return orientacion;
	}

	/**
	 * Setea la orientacion del rayo.
	 * 
	 * @param orientacion orientacion del rayo.
	 */
	
	public void setOrientacion(int orientacion) {
		this.orientacion = orientacion;
	}
	
	/**
	 * Retorna un boolean segun si el rayo esta entrando en la celda o saliendo
	 * de ella.
	 * 
	 * @return boolean true si esta entrando, false en caso contrario.
	 */
	
	public boolean isEntrando() {
		return entrando;
	}

	/**
	 * Setea si el rayo entra o sale.
	 * 
	 * @param entrando true si entra.
	 */
	
	public void setEntrando(boolean entrando) {
		this.entrando = entrando;
	}
	
	/**
	 * Retorna el color del rayo.
	 * 
	 * @return Color color del rayo.
	 */
	
	public Color getColor() {
		return color;
	}

	/**
	 * Setea el color del rayo.
	 * 
	 * @param color color del rayo.
	 */
	
	public void setColor(Color color) {
		this.color = color;
	}
	
	/**
	 * Retorna true si dos rayos son del mismo color.
	 * 
	 * @param rayo rayo contra el cual se va a comparar el color.
	 */
	
	public boolean mismoColor(Rayo rayo){
		return this.getColor().equals(rayo.getColor());
	}
	
	/**
	 * Rota el rayo 90 grados en sentido horario.
	 */
	
	public void rotar() {
		this.orientacion = (orientacion + 1) % 4;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((color == null) ? 0 : color.hashCode());
		result = prime * result + (entrando ? 1231 : 1237);
		result = prime * result + imagenID;
		result = prime * result + orientacion;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Rayo other = (Rayo) obj;
		if (color == null) {
			if (other.color != null)
				return false;
		} else if (!color.equals(other.color))
			return false;
		if (entrando != other.entrando)
			return false;
		if (imagenID != other.imagenID)
			return false;
		if (orientacion != other.orientacion)
			return false;
		return true;
	}

	/**
	 *  Devuelve el punto que hay que sumarle a una celda para ir a la 
	 *  orientacion del rayo 
	 */
	
	public Point getPoint(int orientacion) {
		Map<Integer,Point> map = new HashMap<Integer,Point>();
		map.put(0, new Point(0,1));
		map.put(1, new Point(1,0));
		map.put(2, new Point(0,-1));
		map.put(3, new Point(-1,0));
		return map.get(orientacion);
	}

}
 